<html>
    <head>
        <title>IGuidGenerator接口</title>
    </head>
    <body>
        <script>
             /*
                    二、IGuidGenerator接口

                           GUID最重要的问题是"它默认不是顺序的"。

                           当你使用GUID作为主键并将其设置为表的"聚集索引"时，它会在插入时带来严重的性能问题（因为插入新即可能需要重新排序现有记录）。

                           因此，永远 不要使用 Guid.NewGuid() 来为你的实体创建 Ids!!

                           这个问题的很好的解决方案是生成顺序 Guid，这是由ABP开箱即用的提供的。

                           IGuidGenerator 服务创建顺序 Guid （默认由 SequentialGuidGenerator 实现）。

                           当你需要手动设置实体的ID时，请使用 IGuidGenerator.Create().

                           eg:  具有Guid主键的实体并创建该实体

                                假设你有一个具有Guid键的Product实体：

                                    using System;
                                    using Volo.Abp.Domain.Entities;

                                    namespace AbpDemo
                                    {
                                        public class Product : AggregateRoot<Guid>
                                        {
                                            public string Name { get; set; }

                                            private Product() { // }

                                            public Product(Guid id, string name)
                                                : base(id)
                                            {
                                                Name = name;
                                            }
                                        }
                                    }  
                                        
                                并且你想创建一个新产品：

                                    using System;
                                    using System.Threading.Tasks;
                                    using Volo.Abp.DependencyInjection;
                                    using Volo.Abp.Domain.Repositories;
                                    using Volo.Abp.Guids;

                                    namespace AbpDemo
                                    {
                                        public class MyProductService : ITransientDependency
                                        {
                                            private readonly IRepository<Product, Guid> _productRepository;
                                            private readonly IGuidGenerator _guidGenerator;

                                            public MyProductService(
                                                IRepository<Product, Guid> productRepository,
                                                IGuidGenerator guidGenerator)
                                            {
                                                _productRepository = productRepository;
                                                _guidGenerator = guidGenerator;
                                            }
                                            
                                            public async Task CreateAsync(string productName)
                                            {
                                                var product = new Product(_guidGenerator.Create(), productName);

                                                await _productRepository.InsertAsync(product);
                                            }
                                        }
                                    }

                                此服务在构造函数中注入IGuidGenerator。

                                如果你的类是"应用程序服务"或 "派生自其他基类之一"，你可以直接使用 "GuidGeneratorbase属性",该属性是预注入的IGuidGenerator实例。
                */
        </script>
    </body>
</html>